package com.rw.coco.handler.message.reply.handler.validate;

import com.rw.coco.api.data.persistence.GroupMapper;
import com.rw.coco.api.reply.mapper.AdvancedReply;
import com.rw.coco.handler.message.event.CocoGroupMessageEvent;
import com.rw.coco.handler.message.reply.GroupReplyHandler;
import com.rw.coco.util.config.CocoCommandConfig;
import com.rw.tool.util.string.StringUtil;

/**
 * 群组开关处理器
 */
public class GroupSwitchHandler extends GroupReplyHandler {
    @Override
    protected boolean groupTrigger(CocoGroupMessageEvent groupEvent) {
        CocoCommandConfig cocoCommandConfig = groupEvent.getCocoData().getCocoConfig().getCocoCommandConfig();
        String botOn = cocoCommandConfig.commandProp.get(CocoCommandConfig.BOT_ON);
        String botOff = cocoCommandConfig.commandProp.get(CocoCommandConfig.BOT_OFF);

        // 如果指令匹配，则拦截
        return StringUtil.equalsIgnoreCase(groupEvent.getMessage(), botOn) ||
                StringUtil.equalsIgnoreCase(groupEvent.getMessage(), botOff);
    }

    /**
     * 关于这里的事务考虑
     * <p>
     * 由于这里只涉及到了开关群组聊天的操作
     * 有且仅有一次更改开关操作
     * 有可能会有脏读现象，但是对于结果来说，没有影响，所以没有开启事务
     * <p>
     * 例如可可在关闭状态在极短时间内先后接收到了 "开启"，"关闭"操作
     * 因为脏读现象，开启指令会生效，而关闭指令会提示失效
     * 但是对于用户的感知上而言，会认为 "关闭" 操作会略优先于 "开启" 操作
     * 所以对于体验上来讲没有太大影响，而且这里只涉及到开关字段，不会影响数据一致性
     * 所以不需要开启事务
     */
    @Override
    protected void groupHandler(CocoGroupMessageEvent groupEvent) {
        AdvancedReply advancedReply = groupEvent.getReplyApi().getAdvancedReply();
        CocoCommandConfig cocoCommandConfig = groupEvent.getCocoData().getCocoConfig().getCocoCommandConfig();
        String botOn = cocoCommandConfig.commandProp.get(CocoCommandConfig.BOT_ON);
        String botOff = cocoCommandConfig.commandProp.get(CocoCommandConfig.BOT_OFF);
        GroupMapper groupMapper = groupEvent.getPersistenceMapper().getGroupMapper();
        if (StringUtil.equalsIgnoreCase(groupEvent.getMessage(), botOn)) {
            // 如果群组原本就开启，则回复已开启
            if (groupEvent.getGroupModel().getSwitchOn()) {
                // 如果是管理员则正常回复
                if (groupEvent.isAdmin() || groupEvent.getAccountModel().getSuperAdmin()) {
                    groupEvent.sendBack(advancedReply.botAlreadyOn(groupEvent));
                } else {
                    // 如果不是则回复权限不足
                    groupEvent.sendBack(advancedReply.botOnWithoutAuthorize(groupEvent));
                }
                return;
            }

            // 如果不是超级管理员、群聊管理或群主，权限不足
            if (!groupEvent.isAdmin() && !groupEvent.getAccountModel().getSuperAdmin()) {
                return;
            }

            // 回复
            groupEvent.sendBack(advancedReply.botOn(groupEvent));

            // 开启群组开关
            groupMapper.groupSwitch(groupEvent.getGroup().getId(), true);
        } else if (StringUtil.equalsIgnoreCase(groupEvent.getMessage(), botOff)) {
            // 如果群组开关原本就未开启，则直接返回
            if (!groupEvent.getGroupModel().getSwitchOn()) {
                return;
            }

            // 如果不是超级管理员、群聊管理或群主，则直接回复权限不足
            if (!groupEvent.isAdmin() && !groupEvent.getAccountModel().getSuperAdmin()) {
                groupEvent.sendBack(advancedReply.botOffWithoutAuthorize(groupEvent));
                return;
            }

            // 回复
            groupEvent.sendBack(advancedReply.botOff(groupEvent));

            // 关闭群组开关
            groupMapper.groupSwitch(groupEvent.getGroup().getId(), false);
        }
    }
}
